package com.example.baseutils;

import android.text.format.Time;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by xiaoyuren on 2018/1/26.
 * 项目名称：didano-robot
 * 类描述：
 * company：www.didano.cn
 * email：vin.qin@didano.cn
 * 创建时间：2018/1/26 10:55
 */

public class TimeUtil {

    /**
     * 延时 不关心异常情况
     *
     * @param ms 毫秒
     */
    public static void delayMs(long ms) {
        try {
            Thread.sleep(ms);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 需要外部处理异常情况
     *
     * @param ms
     * @throws InterruptedException
     */
    public static void delay(long ms) throws InterruptedException {
        Thread.sleep(ms);
    }

    public static boolean availableTimesTamp(final long ms) {
        // Logger.i("diff : " +  Math.abs(System.currentTimeMillis() - ms));
        return (Math.abs(System.currentTimeMillis() - ms) < 500);
    }

    /**
     * 获取格式化后的时间
     *
     * @return 20180101112233
     */
    public static String getYMDHMSDate() {
        DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        Calendar calendar = Calendar.getInstance();
        String dateName = df.format(calendar.getTime());
        return dateName;
    }

    /**
     * yyyyMMddHHmmssSSS
     *
     * @return
     */
    public static String getYMDHMS_SSSDate() {
        DateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS", Locale.US);
        Calendar calendar = Calendar.getInstance();
        String dateName = df.format(calendar.getTime());
        return dateName;
    }

    public static String MissionDateFormat = "yyyy年MM月dd日HH:mm:ss";

    /**
     * yyyyMMddHHmmssSSS
     *
     * @return
     */
    public static String getMissionDate() {
        DateFormat df = new SimpleDateFormat(MissionDateFormat, Locale.US);
        Calendar calendar = Calendar.getInstance();
        String dateName = df.format(calendar.getTime());
        return dateName;
    }

    public static String getYMDDate() {
        DateFormat df = new SimpleDateFormat("yyyyMMdd");
        Calendar calendar = Calendar.getInstance();
        String dateName = df.format(calendar.getTime());
        return dateName;
    }

    /**
     * 获取当前的时分
     *
     * @return
     */
    public static String getHM() {
        DateFormat df = new SimpleDateFormat("HH:mm");
        Calendar calendar = Calendar.getInstance();
        String dateName = df.format(calendar.getTime());
        return dateName;
    }

    /**
     * 获取系统时间字符串
     *
     * @param format 要获取的系统时间的格式
     * @return 系统时间字符串
     */
    public static String getDateString(String format) {
        DateFormat df = new SimpleDateFormat(format);
        Calendar calendar = Calendar.getInstance();
        String dateName = df.format(calendar.getTime());
        return dateName;
    }


    /**
     * 将时间字符串转换成长整型值，单位ms
     *
     * @param time   时间字符串
     * @param format 时间字符串的格式
     * @return 返回时间长整型值
     */
    public static long StringToLong(String time, String format) {
        if (time == null) {
            return 0;
        }
        Date date = StringToDate(time, format); // String类型转成date类型
        if (date == null) {
            return 0;
        }
        return DateToLong(date); // date类型转成long类型
    }


    /**
     * 将时间字符串转换成Date类型
     *
     * @param strTime    时间字符串
     * @param formatType 时间格式
     * @return Date类型的时间
     */
    public static Date StringToDate(String strTime, String formatType) {
        SimpleDateFormat formatter = new SimpleDateFormat(formatType);
        Date date = null;
        try {
            date = formatter.parse(strTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * 计算时间差，单位秒
     */
    public static int calLastedTime(Date startDate, Date endDate) {
        long a = endDate.getTime();
        long b = startDate.getTime();
        int c = (int) ((a - b) / 1000);
        return c;
    }

    /**
     * 计算时间差，单位秒
     */
    public static Long missionCalLastedTime(String startDate, String endDate) {
        long a = StringToDate(startDate, MissionDateFormat).getTime();
        long b = StringToDate(endDate, MissionDateFormat).getTime();
        Long c = (Long) ((a - b) / 1000);
        return c;
    }

    /**
     * 将date类型的时间转换成字符串
     *
     * @param data       Date类型的时间
     * @param formatType 要转成的字符串时间格式
     * @return 时间字符串
     */
    // formatType格式为yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日 HH时mm分ss秒
    // data Date类型的时间
    public static String DateToString(Date data, String formatType) {
        return new SimpleDateFormat(formatType).format(data);
    }

    /**
     * 将长整型时间值转化成字符串类型
     *
     * @param currentTime 要转换的长整型时间值
     * @param formatType  要转成的时间格式
     * @return 时间字符串
     */
    // currentTime要转换的long类型的时间
    // formatType要转换的string类型的时间格式
    public static String LongToString(long currentTime, String formatType) {
        Date date = LongToDate(currentTime, formatType); // long类型转成Date类型
        String strTime = DateToString(date, formatType); // date类型转成String
        return strTime;
    }

    /**
     * 将长整型时间值转成Date类型
     *
     * @param currentTime 长整型时间值
     * @param formatType  时间格式
     * @return Date类型的时间值
     */
    // currentTime要转换的long类型的时间
    // formatType要转换的时间格式yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日 HH时mm分ss秒
    public static Date LongToDate(long currentTime, String formatType) {
        Date dateOld = new Date(currentTime); // 根据long类型的毫秒数生命一个date类型的时间
        String sDateTime = DateToString(dateOld, formatType); // 把date类型的时间转换为string
        Date date = StringToDate(sDateTime, formatType); // 把String类型转换为Date类型

        return date;
    }

    /**
     * 将Date类型的时间值转换成long类型值
     *
     * @param date Date类型的时间值
     * @return long类型值
     */
    public static long DateToLong(Date date) {
        return date.getTime();
    }

    /**
     * 将时间字符串进行格式转换
     *
     * @param time       时间字符串
     * @param srcFormat  字符串原格式
     * @param destFormat 要转成的格式
     * @return 新格式的时间字符串
     */
    public static String CovertFormat(String time, String srcFormat, String destFormat) {
        Date date = StringToDate(time, srcFormat);
        return DateToString(date, destFormat);
    }

    /**
     * 判断时间格式是否正确
     *
     * @param timeStr 2016-5-2 08:02:02
     * @return
     */
    public static boolean isValidTimeFormat(String timeStr) {
        String format = "((19|20)[0-9]{2})-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) "
                + "([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]";
        Pattern pattern = Pattern.compile(format);
        Matcher matcher = pattern.matcher(timeStr);
        if (matcher.matches()) {
            pattern = Pattern.compile("(\\d{4})-(\\d+)-(\\d+).*");
            matcher = pattern.matcher(timeStr);
            if (matcher.matches()) {
                int y = Integer.valueOf(matcher.group(1));
                int m = Integer.valueOf(matcher.group(2));
                int d = Integer.valueOf(matcher.group(3));
                if (d > 28) {
                    Calendar c = Calendar.getInstance();
                    c.set(y, m - 1, 1);
                    int lastDay = c.getActualMaximum(Calendar.DAY_OF_MONTH);
                    return (lastDay >= d);
                }
            }
            return true;
        }
        return false;
    }

    /**
     * 判断是否是指定格式的时间字符串
     *
     * @param timeStr 时间字符串
     * @param format  指定的格式
     * @return true表示是 false表示不是
     */
    public static boolean isSpecifiedFormat(String timeStr, final String format) {
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        try {
            Date date = formatter.parse(timeStr);
        } catch (ParseException e) {
            e.printStackTrace();
            return false;
        }

        return true;
    }

    /**
     * 属于星期几
     *
     * @param day
     * @return
     */
    public static boolean isWeekDay(String day) {
        Calendar cal = Calendar.getInstance();
        //星期日=1 星期一=2 因此需要-1操作
        int day_of_week = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (day.contains(day_of_week + "")) {
            return true;
        } else {
            return false;
        }
    }

    public static long currentTimeMillis() {
        Calendar calendar = Calendar.getInstance();
        return calendar.getTime().getTime();
    }

    /**
     * 判断当前系统时间是否在指定时间的范围内
     * <p>
     * beginHour 开始小时,例如22
     * beginMin  开始小时的分钟数,例如30
     * endHour   结束小时,例如 8
     * endMin    结束小时的分钟数,例如0
     * true表示在范围内, 否则false
     */
    public static boolean isCurrentInTimeScope(int beginHour, int beginMin, int endHour, int endMin) {
        boolean result = false;
        final long aDayInMillis = 1000 * 60 * 60 * 24;
        final long currentTimeMillis = System.currentTimeMillis();
        Time now = new Time();
        now.set(currentTimeMillis);
        Time startTime = new Time();
        startTime.set(currentTimeMillis);
        startTime.hour = beginHour;
        startTime.minute = beginMin;
        Time endTime = new Time();
        endTime.set(currentTimeMillis);
        endTime.hour = endHour;
        endTime.minute = endMin;
        // 跨天的特殊情况(比如22:00-8:00)
        if (!startTime.before(endTime)) {
            startTime.set(startTime.toMillis(true) - aDayInMillis);
            result = !now.before(startTime) && !now.after(endTime); // startTime <= now <= endTime
            Time startTimeInThisDay = new Time();
            startTimeInThisDay.set(startTime.toMillis(true) + aDayInMillis);
            if (!now.before(startTimeInThisDay)) {
                result = true;
            }
        } else {
            //普通情况(比如 8:00 - 14:00)
            result = !now.before(startTime) && !now.after(endTime); // startTime <= now <= endTime
        }
        return result;
    }

    public static long timeToLong(String time, String format) {
        if (format == null)
            format = "HH:mm";
        long timestamp = 0L;
        SimpleDateFormat formatDate = new SimpleDateFormat(format); // 设置时间格式
        try {
            Date date = formatDate.parse(time); // 将字符串时间解析为Date对象
            timestamp = date.getTime(); // 获取时间戳
//            System.out.println(timestamp); // 输出时间戳
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return timestamp;
    }
}
